#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{
    const char* fstr = "hello fwrite\n";
    const char* str = "hello write\n";
    
    // C
    printf("hello printf\n");               // stdout -> 1
    sleep(2);
    fprintf(stdout,"hello fprintf\n");      // stdout -> 1
    sleep(2);
    fwrite(fstr,strlen(fstr),1,stdout);     // fread,stdout -> 1
    sleep(2);

    // 操作系统提供的systemcall
    write(1,str,strlen(str));

    sleep(5);
    // C和操作系统各有一个缓冲区，C的代码运行之后会将输出结果放入C的缓冲区中
    // 在C的代码做了某种操作之后(如：有换行符，C代码的进程结束)，刷新缓冲区(将C缓冲区的内容转到操作系统的缓冲区中)，在fork之后分出了子进程，在操作系统的进程结束要打印结果时，子进程触发了写时拷贝，所以也拷贝了缓冲区，又因为写入文件是全缓冲(即缓冲区写满再进行输出或者进程结束输出)
    fork();

    return 0;
}
